package ljl.bilibili.video.controller.video_production;
import ljl.bilibili.client.pojo.UploadVideo;
import ljl.bilibili.video.service.video_production.MinioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.core.io.Resource;

import static ljl.bilibili.video.constant.Constant.*;

/**
 * 视频编码控制类
 */
@RequestMapping("/videoEncode")
@Controller
public class VideoEncodeController {
    @Autowired
    MinioService minioService;

    /**
     * 获取视频输入流
     *
     * @param uploadVideo 包含视频URL的上传视频对象
     * @return ResponseEntity 包含视频输入流的响应实体
     */
    @ApiIgnore
    @PostMapping("/getVideoInputStream")
    public ResponseEntity<Resource>  getVideoInputStream(@RequestBody UploadVideo uploadVideo){
        String url=uploadVideo.getUrl();
        //通过MinIO服务获取对象输入流，使用文件名作为键
        InputStream inputStream = minioService.getObject(url.substring(url.lastIndexOf("/")+1));
        // 创建InputStreamResource对象，用于包装输入流
        InputStreamResource resource = new InputStreamResource(inputStream);
        // 创建ResponseEntity对象，设置响应头和响应体
        // 作用是当客户端接收到这个响应时，会让用户下载该视频文件，而不是尝试在浏览器中播放或显示该视频文件。
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, HEADERS_VALUES)
                .body(resource);
    }
    /**
     * 上传视频文件
     *
     * @param multipartFile 上传的视频文件
     * @throws IOException 如果文件上传过程中发生I/O错误
     */
    @ApiIgnore
    @PostMapping(value = "/uploadVideo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @ResponseBody
    public void uploadVideo(@RequestPart("multipartFile") MultipartFile multipartFile) throws IOException {
        // 通过Minio服务上传视频文件
        minioService.uploadVideoFile(multipartFile.getOriginalFilename(), multipartFile.getInputStream(), VIDEO_TYPE);
    }

    /**
     * 上传视频封面
     *
     * @param multipartFile 上传的视频封面图片
     * @throws IOException 如果文件上传过程中发生I/O错误
     */
    @ApiIgnore
    @PostMapping(value = "/uploadVideoCover", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @ResponseBody
    public void uploadVideoCover(@RequestPart("multipartFile") MultipartFile multipartFile) throws IOException {
        // 通过Minio服务上传视频封面图片
        minioService.uploadImgFile(multipartFile.getOriginalFilename(), multipartFile.getInputStream(), IMAGE_TYPE);
    }
}

